package ucla.axelia.controlador.servicios;

import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import java.util.Map;

import org.hibernate.Query;
import org.hibernate.Session;
import org.hibernate.criterion.Criterion;
import org.hibernate.criterion.Order;
import org.hibernate.criterion.Restrictions;

import com.obelisco.modelo.data.DataGenerica;
import com.obelisco.vista.inicio.Aplicacion;

import ucla.axelia.controlador.interfaces.IServicioAdministracionActividad;
import ucla.axelia.modelo.dao.ServicioActividadDAO;
import ucla.axelia.modelo.dao.ServicioAlergiaDAO;
import ucla.axelia.modelo.dao.ServicioEnfermedadDAO;
import ucla.axelia.modelo.dao.ServicioPerfilDAO;
import ucla.axelia.modelo.dao.ServicioTipoActividadDAO;
import ucla.axelia.modelo.dao.ServicioUsuarioProgramaDAO;
import ucla.axelia.modelo.data.Actividad;
import ucla.axelia.modelo.data.Programa;

public class ServicioAdministracionActividad implements IServicioAdministracionActividad {
    
	private ServicioActividadDAO servicioActividadDAO;
	private ServicioUsuarioProgramaDAO servicioUsuarioProgramaDAO;
	private ServicioTipoActividadDAO servicioTipoActividadDAO;	
	private ServicioPerfilDAO servicioPerfilDAO;
	private ServicioEnfermedadDAO servicioEnfermedadDAO;
	private ServicioAlergiaDAO servicioAlergiaDAO;
	
	
	public List buscarPerfiles(){
		List<Order> orden = new ArrayList<Order>();
		orden.add(Order.asc("nombrePerfil"));
		return servicioPerfilDAO.buscarTodos(DataGenerica.DATA_ACTIVO, orden);
	}
	
	public List buscarAlergias(){
		List<Order> orden = new ArrayList<Order>();
		orden.add(Order.asc("nombreAlergia"));
		return servicioAlergiaDAO.buscarTodos(DataGenerica.DATA_ACTIVO, orden);
	}
	
	public List buscarEnfermedades(){
		List<Order> orden = new ArrayList<Order>();
		orden.add(Order.asc("nombreEnfermedad"));
		return servicioEnfermedadDAO.buscarTodos(DataGenerica.DATA_ACTIVO, orden);
	}
		
	public List buscarTipoActividades() {
		List<Order> orden = new ArrayList<Order>();
		orden.add(Order.asc("nombreTipoActividad"));
		return servicioTipoActividadDAO.buscarTodos(DataGenerica.DATA_ACTIVO, orden);
	}
	
	public List<Programa> buscarProgramasPorUsuarioActual() {
		String login = Aplicacion.getApp().getContexto().getUsuarioActual().getLogin();
		return this.servicioUsuarioProgramaDAO.buscarProgramasPorUsuario(login);
	}
	
	public List buscarActividadesPorCriterios(Map criterios) {
		List<Actividad> actividades = new ArrayList<Actividad>();
		List<Programa> programasPorUsuario = this.buscarProgramasPorUsuarioActual();
		if ((programasPorUsuario != null) &&
			(programasPorUsuario.size() > 0)) {
			Session session = this.servicioActividadDAO.getSessionFactory().getCurrentSession();		
			String sentencia = "Select actividad " +
							   "from Actividad actividad " +
							   "where actividad.estado = :estado "+//con estado activo"
							   "and actividad.programa in (:programas) ";
			for (int i=0; i<criterios.size(); i++){
				String llave = (String)criterios.keySet().toArray()[i];
				Object valor = (criterios.get(criterios.keySet().toArray()[i]));
				if (llave.equals("nombreActividad")) {
					sentencia +=  "and upper(actividad."+llave+") like '%"+((String)valor).toUpperCase()+"%' ";
				}
				else {
					sentencia +=  "and actividad."+llave+" = '"+valor+"' ";
				}
			}
			sentencia += "order by actividad.nombreActividad";
			Query qry = session.createQuery(sentencia);
			qry.setString("estado", DataGenerica.DATA_ACTIVO);
			qry.setParameterList("programas", programasPorUsuario);
			actividades = qry.list();
			
			for (Iterator iter = actividades.iterator(); iter.hasNext(); ) {
				Actividad actividad = (Actividad)iter.next();
				actividad.getPerfilActividads().size();
				actividad.getActividadEnfermedads().size();
				actividad.getActividadAlergias().size();
				actividad.getActividadRequeridasForIdActividad().size();
			}
		}		
		return actividades;
	}
	
	public List buscarActividades() {
		List<Actividad> actividades = new ArrayList<Actividad>();
		List<Programa> programasPorUsuario = this.buscarProgramasPorUsuarioActual();
		if ((programasPorUsuario != null) &&
			(programasPorUsuario.size() > 0)){
			List<Order> orden = new ArrayList<Order>();
			orden.add(Order.asc("nombreActividad"));
			List<Criterion> criterios = new ArrayList<Criterion>();
			criterios.add(Restrictions.in("programa", programasPorUsuario));
			actividades = servicioActividadDAO.buscarPorPropiedades(criterios, DataGenerica.DATA_ACTIVO, orden);
		}
		return actividades; 
	}
	
	
	public void eliminarActividad(Actividad actividad) {
		servicioActividadDAO.eliminarLogicamente(actividad, false);
	}

	public void guardarActividad(Actividad actividad) {
		servicioActividadDAO.guardar(actividad);
	}
	
	
	// Getter y Setter
	public void setServicioActividadDAO(ServicioActividadDAO servicioActividadDAO) {
		this.servicioActividadDAO = servicioActividadDAO;
	}

	public ServicioActividadDAO getServicioActividadDAO() {
		return servicioActividadDAO;
	}

	public ServicioUsuarioProgramaDAO getServicioUsuarioProgramaDAO() {
		return servicioUsuarioProgramaDAO;
	}
	
	public void setServicioUsuarioProgramaDAO(
			ServicioUsuarioProgramaDAO servicioUsuarioProgramaDAO) {
		this.servicioUsuarioProgramaDAO = servicioUsuarioProgramaDAO;
	}
	
	public ServicioTipoActividadDAO getServicioTipoActividadDAO() {
		return servicioTipoActividadDAO;
	}

	public void setServicioTipoActividadDAO(
			ServicioTipoActividadDAO servicioTipoActividadDAO) {
		this.servicioTipoActividadDAO = servicioTipoActividadDAO;
	}
	
	public ServicioAlergiaDAO getServicioAlergiaDAO() {
		return servicioAlergiaDAO;
	}
	
	public void setServicioAlergiaDAO(ServicioAlergiaDAO servicioAlergiaDAO) {
		this.servicioAlergiaDAO = servicioAlergiaDAO;
	}
	
	public ServicioEnfermedadDAO getServicioEnfermedadDAO() {
		return servicioEnfermedadDAO;
	}
	
	public void setServicioEnfermedadDAO(ServicioEnfermedadDAO servicioEnfermedadDAO) {
		this.servicioEnfermedadDAO = servicioEnfermedadDAO;
	}
	
	public ServicioPerfilDAO getServicioPerfilDAO() {
		return servicioPerfilDAO;
	}
	
	public void setServicioPerfilDAO(ServicioPerfilDAO servicioPerfilDAO) {
		this.servicioPerfilDAO = servicioPerfilDAO;
	}

}
